package com.cf.super_hero.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.cf.super_hero.tools.JWT;
import com.cf.super_hero.tools.Result;
import io.jsonwebtoken.ExpiredJwtException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
intercept的作用范围只适用于spring-boot工程的请求API会被拦截,若不是由Spring-boot工程的API，则不会，这时就需要过滤器
filiter，而不是拦截器
 */

@Slf4j
@Component
public class CheckInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /*
        登录校验代码
         */
        String req_url=request.getRequestURL().toString();
        log.info("请求的url为:{}",req_url);
        if(req_url.contains("login")||req_url.contains("enroll")){
            log.info("放行");
            return true;
        }
        String method=request.getMethod();
//        因为网络请求过程中，通常第一个请求，并不是，你硬编码在前端的请求方式，而是一个option请求，因此，在最开始登陆的时候，就会有一个
//        option请求，这个请求如果被拦截的话，就会出现，签名就永远回不到前端，可想而知，你的前端都是无法正常请求的
        if(HttpMethod.OPTIONS.toString().equals(method)){
            return  true;
        }
        String jwt=request.getHeader("token");
        log.info("Token值:{}",jwt);
        if(!StringUtils.hasLength(jwt)){
            /*
            这一步逻辑是为了判断请求的参数是否为空,因为为空的话，那肯定不用判断，直接否定
             */
            log.info("NO_TOKEN");
            Result no_token = Result.error(401,"NO_TOKEN");
//          转换为json字符串
            String string = JSONObject.toJSONString(no_token);
//            将数据响应给前端
            response.getWriter().write(string);
            return false;
        }
        try{
            JWT.parseJwt(jwt);
        }catch (ExpiredJwtException e){
            e.printStackTrace();
            log.info("密钥过期,请重新登录!");
            Result imexcept_token = Result.error(303, "过期密钥，请重新登录!");
            String string = JSONObject.toJSONString(imexcept_token);
            response.getWriter().write(string);
            return false;
        }
        log.info("令牌合法!");
        return true;
    }
/*
这里还有两种方法，分别是postHandle这个方法，和
 */
}

/*
总结:关于interceptor的注册过程有两步：
1、需要实现一个接口，这个接口叫做HandlerInterceptor,并实现其中的preHandle方法(即写逻辑的过程)，并将该类注解为Component
2、注册该类，同理需要在实现一个接口，这个接口叫做WebMvcConfigurer,并给该注解加上一个Configuration注解，里面实现一个 addInterceptors方法
 */